#pragma once

#include <iostream>
#include <cassert>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

void MyDaemon()
{
    // 1. 忽略信号
    signal(SIGPIPE, SIG_IGN);
    signal(SIGCHLD, SIG_IGN);

    // 2. 不是进程组-组长的进程才能成功调用setsid
    pid_t id = fork();
    assert(id >= 0);

    if (id > 0)
        exit(0);

    if (0 == id)
    {
        // 3. 调用setsid
        setsid();

        // 4. 重定向：守护进程不能直接向显示器打印消息
        int dev_null = open("/dev/null", O_RDONLY | O_WRONLY);
        if (dev_null > 0)
        {
            dup2(0, dev_null);
            dup2(1, dev_null);
            dup2(2, dev_null);
            close(dev_null);
        }
    }
}